import {
	defineStore
} from "pinia"
import {
	reactive,
	ref
} from "vue"
import {
	request
} from '../utils/request.js'

export const useUserStore = defineStore('user', () => {
	// -----------------------------
	// state
	// -----------------------------
	const userInfo = reactive({
		_id: null,
		nickName: "",
		avatar: "",
		phone: "",
		isVip: false,
		collections: [],
		likes: [],
		browses: [],
		gender: null,
	})

	// 将 token 改为 ref，手动管理
	const token = ref('')
	
	// 从本地存储读取 token
	const refreshToken = () => {
		const localToken = uni.getStorageSync('token') || ''
		token.value = localToken
		console.log('刷新 token:', localToken ? '存在' : '不存在')
		return localToken
	}

	// 初始化时从本地存储加载用户信息
	const initUserInfo = () => {
		const savedUserInfo = uni.getStorageSync('userInfo')
		const savedToken = uni.getStorageSync('token')
		
		console.log('=== 初始化用户状态 ===')
		console.log('本地存储的 token:', savedToken ? '存在' : '不存在')
		console.log('本地存储的 userInfo:', savedUserInfo ? '存在' : '不存在')
		
		// 加载 token
		if (savedToken) {
			token.value = savedToken
			console.log('token 加载成功')
		}
		
		// 加载用户信息
		if (savedUserInfo) {
			try {
				const info = JSON.parse(savedUserInfo)
				Object.assign(userInfo, info)
				console.log('用户信息加载成功:', info.nickName)
			} catch (err) {
				console.error('解析用户信息失败', err)
			}
		} else {
			console.log('没有找到本地用户信息')
		}
	}

	// 初始化
	initUserInfo()

	// -----------------------------
	// actions
	// -----------------------------
	const login = async (data) => {
		try {
			const res = await request({
				url: '/users/login',
				method: 'POST',
				data
			})

			console.log('=== 登录接口完整返回 ===')
			console.log('res:', JSON.stringify(res, null, 2))

			if (res.code === 200) {
				const info = res.data
				
				// 获取 token（可能在 res.token 或 res.data.token）
				const tokenValue = res.token || res.data?.token || info.token
				
				console.log('提取的 token:', tokenValue)
				
				if (!tokenValue) {
					console.error('⚠️ 警告：登录成功但未获取到 token！')
					uni.showToast({
						title: '登录异常，请重试',
						icon: 'none'
					})
					return res
				}
				
				// 持久化 token 和用户信息到本地（先保存）
				uni.setStorageSync('token', tokenValue)
				
				// 立即更新 store 中的 token
				token.value = tokenValue
				
				const userInfoToSave = {
					_id: info._id,
					nickName: info.nickName,
					avatar: info.avatar,
					phone: info.phone,
					isVip: info.isVip,
					collections: info.collections || [],
					likes: info.likes || [],
					browses: info.browses || [],
					gender: info.gender,
				}
				uni.setStorageSync('userInfo', JSON.stringify(userInfoToSave))
				
				// 验证保存是否成功
				const savedToken = uni.getStorageSync('token')
				const savedUserInfo = uni.getStorageSync('userInfo')
				
				console.log('=== 登录成功，保存信息 ===')
				console.log('Token 已保存:', tokenValue)
				console.log('UserInfo 已保存:', userInfoToSave)
				console.log('验证 - 本地存储的 token:', savedToken)
				console.log('验证 - 本地存储的 userInfo:', savedUserInfo ? '存在' : '不存在')
				
				// 保存用户信息到 pinia
				Object.assign(userInfo, userInfoToSave)

				uni.showToast({
					title: '登录成功',
					icon: 'success'
				})
			} else {
				uni.showToast({
					title: res.message || '登录失败',
					icon: 'none'
				})
			}

			return res
		} catch (error) {
			console.error("登录异常:", error)
			uni.showToast({
				title: '网络错误',
				icon: 'none'
			})
		}
	}

	// -----------------------------
	// 退出登录
	// -----------------------------
	const logout = () => {
		// 清空本地缓存
		uni.removeStorageSync('token')
		uni.removeStorageSync('userInfo')
		
		// 清空 token
		token.value = ''
		
		// 重置状态
		Object.assign(userInfo, {
			_id: null,
			nickName: "",
			avatar: "",
			phone: "",
			isVip: false,
			collections: [],
			likes: [],
			browses: [],
			gender: null,
		})
		
		uni.showToast({
			title: '已退出登录',
			icon: 'success'
		})
	}

	// -----------------------------
	// 获取用户信息
	// -----------------------------
	const fetchUserInfo = async () => {
		try {
			const res = await request({
				url: '/users/info',
				method: 'GET'
			})
			
			if (res.code === 200) {
				const info = res.data
				// 更新用户信息
				Object.assign(userInfo, {
					_id: info._id,
					nickName: info.nickName,
					avatar: info.avatar,
					phone: info.phone,
					isVip: info.isVip,
					collections: info.collections || [],
					likes: info.likes || [],
					browses: info.browses || [],
					gender: info.gender,
				})
				
				// 更新本地存储
				uni.setStorageSync('userInfo', JSON.stringify(userInfo))
			}
			
			return res
		} catch (error) {
			console.error('获取用户信息失败:', error)
		}
	}

	return {
		userInfo,
		token,
		login,
		logout,
		fetchUserInfo,
		refreshToken
	}
})